package myself.study.network.udp.demo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
* @Name: UdpServerDemo
* @Description: udp协议服务端接收数据测试类
* 步骤：
* 	1、创建接收端Socket对象；
* 		DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。
* 	2、创建数据包（接收数据的容器）
* 		DatagramPacket(byte[] buf, int length) 	构造 DatagramPacket，用来接收长度为 length 的数据包
* 	3、调用Socket对象的接收方法，接收数据包；
* 		//从此套接字接收数据报包。当此方法返回时，DatagramPacket 的缓冲区填充了接收的数据。数据报包也包含发送方的 IP 地址和发送方机器上的端口号。 
* 		//此方法在接收到数据报前一直阻塞。
* 		public void receive(DatagramPacket p) 
* 	4、解析客户端发送的数据包；
* 		public byte[] getData()	返回数据缓冲区。接收到的或将要发送的数据从缓冲区中的偏移量 offset 处开始，持续 length 长度。
* 		public int getOffset()	返回将要发送或接收到的数据的偏移量。 
* 		public int getLength()	返回将要发送或接收到的数据的长度。 
* 		public SocketAddress getSocketAddress()	获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress（通常为 IP 地址 + 端口号）。 
* 		public InetAddress getAddress()	返回某台机器的 IP 地址，此数据报将要发往该机器或者是从该机器接收到的。 
* 		public int getPort()	返回某台远程主机的端口号，此数据报将要发往该主机或者是从该主机接收到的。 
* 		
* 	5、释放资源
* 		public void close()	关闭此数据报套接字。 
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-11 下午11:04:01 
* @Version: V1.0
 */
public class UdpServerDemo {
	
	public static void main(String[] args) throws IOException {
		//1、创建接收端Socket对象
		DatagramSocket server = new DatagramSocket(12345) ;
		//2、创建数据包（接收数据的容器）
		//DatagramPacket(byte[] buf, int length) 	 构造 DatagramPacket，用来接收长度为 length 的数据包。
		//接收数据的字节容器
		byte[] buf = new byte[1024] ;
		//接收长度
		int length = buf.length ;
		DatagramPacket packet = new DatagramPacket(buf, length) ;
		//3、调用Socket对象的接收方法，接收数据包；该方法为阻塞方法，等待接收客户端发送数据
		//void receive(DatagramPacket p)  从此套接字接收数据报包。
		server.receive(packet) ;
 		//4、解析客户端发送的数据包；
		//public byte[] getData()	返回数据缓冲区。接收到的或将要发送的数据从缓冲区中的偏移量 offset 处开始，持续 length 长度。
		//public int getLength()	返回将要发送或接收到的数据的长度。 
		//接收客户端发送的数据
		byte[] data = packet.getData() ;
		//获取数据的实际长度
		int dataLen = data.length ;
		//将字节数组数据转换成字符串
		String s = new String(data, 0, dataLen) ;
		//获取客户端ip地址
		//public InetAddress getAddress()	返回某台机器的 IP 地址，此数据报将要发往该机器或者是从该机器接收到的。 
		InetAddress address = packet.getAddress() ;
		System.out.println(address.getHostAddress() + ":" + s);
		//5、释放资源
		server.close() ;
	}
	
}
